package middleware

import (
	"github.com/gin-gonic/gin"    // Gin Web 框架
	"go-ecommerce/internal/utils" // 引入 utils 包（请根据项目路径修改）
	"net/http"                    // HTTP 状态码
	"strings"                     // 字符串处理
)

// JWTAuthMiddleware 是 Gin 的 JWT 鉴权中间件函数
// 它会拦截请求，检查 Authorization Header 中是否携带合法 token
// 若合法则提取 user_id、username 注入到上下文中，供后续处理使用
func JWTAuthMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 从请求头中获取 Authorization 字段（格式应为 "Bearer token_xxx"）
		authHeader := c.GetHeader("Authorization")
		if authHeader == "" {
			// 未携带 token
			c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "请求未携带 token"})
			c.Abort() // 阻止继续执行
			return
		}

		// 拆分 Authorization 字段，期望格式为：Bearer token_string
		parts := strings.SplitN(authHeader, " ", 2)
		if len(parts) != 2 || parts[0] != "Bearer" {
			// token 格式不符合预期
			c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "token 格式错误"})
			c.Abort()
			return
		}

		// 解析 token（调用工具函数）
		claims, err := utils.ParseToken(parts[1])
		if err != nil {
			// token 无效或过期或 Redis 校验失败
			c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "token 无效或已过期"})
			c.Abort()
			return
		}

		// 将用户信息注入上下文，供后续处理函数使用
		c.Set("admin_id", claims.UserID)   // 保存用户 ID
		c.Set("username", claims.Username) // 保存用户名

		// 继续执行下一个处理器
		c.Next()
	}
}
